<?php
if( !class_exists('uc') ) {
    include dirname(__FILE__).'/api.php';
    /**
     * 描述 : userCenter 核心
     * 注明 :
     *       1 : 成功
     *      -1 : 失败
     *      -2 : 拒绝,小数说明(-2.1:未通过安全校验; -2.2:服务端不存在客户端的配置文件 -2.3:服务端收到信息但请求超时)
     * 作者 : Edgar.lee
     */
    class uc extends uc_api_api {
        public static $rootDir = '';
        public static $config = '';

        /**
         * 描述 : 初始化
         * 作者 : Edgar.lee
         */
        public static function _init() {
            self::$rootDir = dirname(dirname(__FILE__));                                                                    //uc 根目录
            self::$config = (include self::$rootDir . '/config.php') + array(                                               //初始化配置文件
                    'timeout' => 30,
                    'charset' => 'UTF-8'
                );
            include self::$rootDir . '/api/system.php';                                                                     //加载封装类
            include self::$rootDir . '/com/face.php';                                                                       //加载对接类
        }

        /**
         * 描述 : 执行操作
         * 返回 :
         *      成功返回数据,失败返回false
         * 作者 : Edgar.lee
         */
        public static function &_exec($params) {
            $cofig = &self::$config;                                                                                        //引用配置文件

            if( empty($cofig['url']) ) {                                                                                    //mysql直连
                $data = &self::_call($params, 'uc::', false);                                                               //调用请求信息
            } else {                                                                                                        //网络请求
                $timeout = time() + $cofig['timeout'];                                                                      //超时时间戳
                self::_coding($params, true);                                                                               //加密数据

                $data = &uc_api_system::request($cofig['url'] . '/api/oi.php', array(
                        'get'  => array(
                            'id'   => $cofig['id'],
                            'to'   => $timeout,
                            'md5'  => md5($cofig['id'] . $cofig['key'] . $timeout),
                        ),
                        'post' => array(
                            'data' => &$params
                        )
                    ));
                //print_r($data);
                if( $data['state'] && is_array($data = &self::_coding($data['response'], false)) ) {                        //请求成功
                    $data = &$data['data'];
                } else {
                    $data = false;
                }
            }

            return $data;
        }

        /**
         * 描述 : 调用功能方法
         * 作者 : Edgar.lee
         */
        public static function &_call(&$params, $pre, $type) {
            if( $params['call'][0] !== '_' && is_callable($temp = $pre . $params['call']) ) {
                empty($params['params']) && $params['params'] = array();
                $data = call_user_func_array($temp, $params['params']);

                $type && $data = array('data' => $data);                                                                //调用请求信息
            } else {
                $data = false;
            }

            return $data;
        }

        /**
         * 描述 : 加密解密代码
         * 作者 : Edgar.lee
         */
        public static function &_coding(&$params, $type) {
            $cofig = &self::$config;                                                                                        //引用配置文件

            if( $type ) {                                                                                                   //加密数据
                self::_charset($params, true);                                                                               //转成UTF-8编码
                $params = uc_api_system::rc4($cofig['key'], json_encode($params), true);
            } else {                                                                                                        //数据解密
                $params = json_decode(uc_api_system::rc4($cofig['key'], $params, false), true);
                self::_charset($params, false);                                                                              //转成系统编码
            }

            return $params;
        }

        /**
         * 描述 : 编码转换
         * 作者 : Edgar.lee
         */
        private static function _charset(&$data, $tpye) {
            $config = &self::$config;                                                                                       //引用配置文件
            $wait = array(&$data);                                                                                          //待处理列表

            if( $config['charset'] !== 'UTF-8' ) {
                do {
                    $wk = key($wait);
                    $wv = &$wait[$wk];
                    unset($wait[$wk]);

                    if( is_array($wv) ) {
                        $result = array();                                                                                  //结果列表
                        foreach($wv as $k => &$v) {
                            $k = $tpye ?
                                iconv($config['charset'], 'UTF-8' . '//IGNORE', $k) :
                                iconv('UTF-8', $config['charset'] . '//IGNORE', $k);
                            $result[$k] = &$v;
                            $wait[] = &$v;
                        }
                        $wv = $result;
                    } else if( is_string($wv) ) {
                        $wv = $tpye ?
                            iconv($config['charset'], 'UTF-8' . '//IGNORE', $wv) :
                            iconv('UTF-8', $config['charset'] . '//IGNORE', $wv);
                    }
                } while( !empty($wait) );
            }

            return $data;
        }
    }

    uc::_init();
}